FUNCTION BINARY_SEARCH : LINT
  VAR_INPUT
    // 指向待查找整数数组的引用（必须是有序数组）
    pData : REF_TO INT;
    // 数组元素个数
    udiSize : UDINT;
    // 要查找的目标值
    iTarget : INT;
  END_VAR

  VAR
    // 查找区间的左边界
    udiLeft : UDINT := 0;
    // 查找区间的右边界
    udiRight : UDINT;
    // 中间位置
    udiMid : UDINT;
    // 中间位置的值
    iMidValue : INT;
  END_VAR

  // 检查输入参数有效性
  IF pData = 0 OR udiSize = 0 THEN
    BINARY_SEARCH := -1;  // 返回-1表示未找到或参数无效
    RETURN;
  END_IF;

  // 初始化右边界
  udiRight := udiSize - 1;

  // 二分查找算法
  WHILE udiLeft <= udiRight DO
    // 计算中间位置，避免溢出
    udiMid := udiLeft + (udiRight - udiLeft) / 2;
    
    // 获取中间位置的值
    iMidValue := (pData+udiMid)^;
    
    // 如果找到目标值，返回索引
    IF iMidValue = iTarget THEN
      BINARY_SEARCH := UDINT_TO_LINT(udiMid);
      RETURN;
    // 如果中间值小于目标值，在右半部分查找
    ELSIF iMidValue < iTarget THEN
      udiLeft := udiMid + 1;
    // 如果中间值大于目标值，在左半部分查找
    ELSE
      IF udiMid = 0 THEN
        // 避免UDINT下溢
        EXIT;
      END_IF;
      udiRight := udiMid - 1;
    END_IF;
  END_WHILE;

  // 遍历完所有可能区间都没找到，返回-1
  BINARY_SEARCH := -1;

END_FUNCTION
